package org.luxor.commons.core.utils;

import java.text.DecimalFormat;

/**
 * 文件大小单位换算
 *
 * @author admin @date 2019/9/15 15:53 @version 0.0.1
 */
public class FileSizeUtils {
    //倍率
    public final static int ONE = 1;
    public final static int THOUSAND = 1024;
    public final static int MILLION = 1024 * 1024;
    public final static int BILLION = 1024 * 1024 * 1024;

    public final static String B = "B";
    public final static String KB = "KB";
    public final static String MB = "MB";
    public final static String GB = "GB";

    /**
     * 单位晋级/进位
     *
     * @param nb 原大小
     * @param NB 倍率
     * @return
     */
    public static long nbUpToNB(Long nb, int NB) {
        return nb / NB;
    }

    /**
     * 单位晋级/进位
     *
     * @param nb 原大小
     * @param NB 倍率
     * @return
     */
    public static String nbUpToNBStr(Long nb, int NB) {
        DecimalFormat df = new DecimalFormat("0.00");
        return df.format((double) nb / NB);
    }

    /**
     * 单位晋级/进位(字符串)
     *
     * @param nb   原大小
     * @param NB   倍率
     * @param unit 单位
     * @return
     */
    public static String bUpToNBStr(Long nb, int NB, String unit) {
        return nbUpToNBStr(nb, NB) + unit;
    }

    /**
     * 单位降级/退位
     *
     * @param nb 原大小
     * @param NB 倍率
     * @return
     */
    public static long nbUmToNB(long nb, int NB) {
        return nb * NB;
    }

    /**
     * 单位降级/退位(字符串)
     *
     * @param nb   原大小
     * @param NB   倍率
     * @param unit 单位
     * @return
     */
    public static String bUmToNBStr(long nb, int NB, String unit) {
        return nbUpToNB(nb, NB) + unit;
    }

    /**
     * b转其它单位自适应 只适应非负数
     *
     * @param nb
     * @return
     */
    public static String bUpAuto(long nb) {
        if (nb <= 0) {
            return "0";
        }
        if (nb / BILLION > 0) {
            return nb / BILLION + GB;
        }
        if (nb / MILLION > 0) {
            return nb / MILLION + MB;
        }
        if (nb / THOUSAND > 0) {
            return nb / THOUSAND + KB;
        }
        return nb + B;
    }
}
